/**
 * Created by zhangqi on 2015/11/10.
 * 表格隐藏列插件
 * options Object 参数配置
 * options.sTableId 初始化表格的id  必传
 * options.aColModels 初始化表格的列的对象集合  必传
 * options.aColNames 初始化表格的列的名称的数组  必传
 * options.iRow 表头是单行模式还是双行的合并单元格模式 非必传  如果是双行则必传 iRow:2
 */
;(function($){
    $.fn.extend({
        jqGridBackboard:function(options){
            var $warp = this;
            var sTableId = options.sTableId; //核心表格标签的id
            var aColModels = options.aColModels;
            var aColNames = options.aColNames;
            var iRow = options.iRow || 1; //表头是否又合并单元格的
            var isHasFrozen = false; // 是否含有冻结的列

            //放入必要容器
            var sHtml1 = '<div class="myjqgrid_backboard_down '+(iRow==2?'myjqgrid_backboard_down_2row':'')+'"></div><div class="myjqgrid_backboard '+(iRow==2?'myjqgrid_backboard_2row':'')+'"></div>';
            $warp.append(sHtml1);

            var iLen = $("#"+sTableId).jqGrid('getGridParam', 'width');
            var sHtml2 = '<div class="myjqgrid_backboard_title"><h1>显示列</h1> <lable style="font-weight: normal;margin-left: 15px;"><input type="checkbox" class="mmgrid_check_all" style="vertical-align: middle;"> 全选</lable></div>' +
                '<div class="myjqgrid_backboard_content">';

            //如果存在列
            if(aColModels.length && aColNames.length){
                var aCheckbox = [];
                var aHideCols = []; //要隐藏的列
                for(var i=0;i<aColNames.length;i++){
                    //隐藏掉辅助索引列
                    if(aColModels[i].name=='_indexId'){
                        aHideCols.push('_indexId');
                        continue; //跳过索引列显示复选框
                    }
                    var sCheckStr = "checked";
                    //隐藏该列
                    if(!aColModels[i].isListShow && typeof aColModels[i].isListShow !== "undefined"){
                        sCheckStr = "";
                        aHideCols.push(aColModels[i].name);
                    }
                    aCheckbox.push('<label class="mmg-backboard-checklabel"><input class="mmg-backboard-checkbox" data-name="'+aColModels[i].name+'" type="checkbox" '+sCheckStr+' '+(aColModels[i].frozen?"disabled title='冻结列不可隐藏' ":" ")+'><span title="'+aColNames[i]+'">'+aColNames[i]+(aColModels[i].groupName?('('+aColModels[i].groupName+')'):'')+'</span></label>');
                    //如果有冻结的列
                    if(aColModels[i].frozen){
                        isHasFrozen = true
                    }
                }  
                aHideCols.length && $("#"+sTableId).jqGrid("hideCol",aHideCols);
                $("#"+sTableId).jqGrid("setGridWidth",iLen);
                $("#"+sTableId).jqGrid("hideCol","_indexId"); // 加这一句能够解决刚进来序号列表头宽度特别宽的问题

                sHtml2 += aCheckbox.join("")+'</div><div class="myjqgrid_backboard_up"></div>';

                //判断是否全选
                var fnCheckIsCheckAll = function () {
                    if(!$warp.find(".myjqgrid_backboard_content").find("input[type='checkbox']:not(:checked)").length){
                        $warp.find("input.mmgrid_check_all").prop("checked",true);
                    }
                };

                //勾选事件
                $warp.find(".myjqgrid_backboard").html(sHtml2).on("click","input[type='checkbox']",function(){
                    fnCheckIsCheckAll();

                    if($(this).prop("checked")){
                        $("#"+sTableId).jqGrid("showCol",$(this).attr("data-name"));
                    }else{
                        $("#"+sTableId).jqGrid("hideCol",$(this).attr("data-name"));
                        var $all = $warp.find(".mmgrid_check_all");
                        if($all.prop("checked")){
                            $all.prop("checked",false);
                        }
                    }

                    //计算宽度，如果每列的传值宽度总和大于浏览器的宽度则使用固定宽度，否则使用自适应宽度
                    var shrinkToFit = true; //则按比例初始化列宽度
                    var aCol = $("#"+sTableId).jqGrid("getGridParam", 'colModel');
                    if(aCol.length){
                        var iWidth = 0;
                        for(var i=0;i<aCol.length;i++){
                            if(!aCol[i].hidden){
                                iWidth += (aCol[i].widthOrg?aCol[i].widthOrg:0);
                            }
                        }
                        if(iWidth > $("#base_metadata_wrap").width()){
                            shrinkToFit = false;  //则列宽度使用colModel指定的宽度
                        }
                    }

                    //如果有冻结的列就是用固定宽度，这样就不会产生冻结列的表格列出现两次
                    if(isHasFrozen){
                        $("#"+sTableId).jqGrid("setGridWidth", iLen, false);
                    }else {
                        $("#"+sTableId).jqGrid("setGridWidth", iLen, shrinkToFit);
                    }
                });

                //绑定事件
                $warp.on("mouseenter",".ui-jqgrid-hdiv",function(){
                    $warp.find(".myjqgrid_backboard_down").stop(true,true).slideDown(200);
                });
                $warp.on("mouseleave",".ui-jqgrid-hdiv",function(event){
                    if(!$(event.relatedTarget).closest(".myjqgrid_backboard_down").length){
                        $warp.find(".myjqgrid_backboard_down").stop(true,true).slideUp(200);
                    }
                });
                $warp.on("mouseleave",".myjqgrid_backboard_down",function(event){
                    $warp.find(".myjqgrid_backboard_down").stop(true,true).slideUp(200);
                });
                //展开操作显示列
                $warp.on("click",".myjqgrid_backboard_down",function(event){
                    $warp.find(".myjqgrid_backboard").stop(true,true).slideDown(200);
                });

                //收起操作显示列
                var fnBackboardUp = function () {
                    $warp.find(".myjqgrid_backboard").stop(true,true).slideUp(200);
                    //存储选中的列头信息
                    var bgbObj = {};
                    $warp.find(".myjqgrid_backboard_content").find("input[type='checkbox']").each(function(){
                        if($(this).attr("data-name")){
                            bgbObj[$(this).attr("data-name")] = $(this)[0].checked?"true":"false";
                        }
                    });
                    typeof options.afterSelectBackboard == "function" && options.afterSelectBackboard(bgbObj);
                };
                $warp.on("click",".myjqgrid_backboard_up",function(event){
                    fnBackboardUp();
                    event.stopPropagation();
                });

                $(document).off("click.up_jqgrid_backboard").on("click.up_jqgrid_backboard",function (event) {
                    if(!$(event.target).closest(".myjqgrid_backboard ").length && !$(event.target).closest(".myjqgrid_backboard_down").length){
                        fnBackboardUp();
                    }
                });

                //全选事件
                $warp.on("click",".mmgrid_check_all",function(){
                    if($(this).prop("checked")){
                        var aShowCols = []; //要显示的列
                        $warp.find(".myjqgrid_backboard_content").find("input[type='checkbox']:not([disabled])").prop("checked",true);
                        for(var i=0;i<aColModels.length;i++){
                            if(aColModels[i].name =="_indexId"  || aColModels[i].frozen){
                                continue;
                            }
                            aShowCols.push(aColModels[i].name);
                        }
                        if(aShowCols.length){
                            $("#"+sTableId).jqGrid("showCol",aShowCols);
                            $("#"+sTableId).jqGrid("setGridWidth",iLen,true);
                        }
                    }else{
                        var aHideCols = []; //要隐藏的列
                        $warp.find(".myjqgrid_backboard_content").find("input[type='checkbox']:not([disabled])").prop("checked",false);
                        for(var i=0;i<aColModels.length;i++){
                            if(aColModels[i].name =="_indexId" || aColModels[i].frozen){
                                continue;
                            }
                            aHideCols.push(aColModels[i].name);
                        }
                        if(aHideCols.length){
                            $("#"+sTableId).jqGrid("hideCol",aHideCols);
                            $("#"+sTableId).jqGrid("setGridWidth",iLen,false);
                        }
                       
                    }
                });

            }
        }
        /**
         * 修复冻结列的情况下，两边数据行的高度不一样的bug
         * 终极hack列冻结导致的高度问题
         * @param  {[String]} listId [列表ID]
         */
        ,hackHeight:function(listId){
            $("#" +listId + '_frozen tr').slice(1).each(function() {
                var rowId = $(this).attr('id');
                var frozenTdHeight = parseFloat($('td:first', this).height());
                var normalHeight = parseFloat($("#" +listId + ' #' + $(this).attr('id')).find('td:first').height());

                // 如果冻结的列高度小于未冻结列的高度则hack之
                if (frozenTdHeight < normalHeight) {
                    $('td', this).each(function() {
                        /*
                         浏览器差异高度hack
                         */
                        var space = 0.5; // opera默认使用0就可以

                        if (!$(this).attr('style') || $(this).attr('style').indexOf('height:') == -1) {
                            $(this).attr('style', $(this).attr('style') + ";height:" + (normalHeight + space) + "px !important");
                        }
                    });
                }
            });
        }
    });
})(jQuery);
